package org.lestr.secuel.m3ds.objets2D;

import java.awt.Image;
import java.util.Collection;
import java.util.Iterator;

import org.lestr.secuel.m3ds.Variable;
import org.lestr.secuel.m3ds.animations.AnimationObjets2D;

public interface IObjet2d {


    /* ----------------------------
     * Général
     * ---------------------------- */
    /** Défini le nom de l'objet */
    public void setNom(String nom);


    /** Retourne le nom de l'objet */
    public String getNom();


    /** Défini les variables de l'objet */
    public void setVariables(Collection<Variable> variables);


    /** Retourne les variables de l'objet */
    public Collection<Variable> getVariables();


    /** Ajoute un écouteur */
    public void ajoutEcouteur(Objet2DEcouteur écouteur);


    /** Retire un écouteur */
    public void retraitEcouteur(Objet2DEcouteur écouteur);


    /* ----------------------------
     * Collisions
     * ---------------------------- */
    /** Ajoute un objet aux objet à prévenir en cas de collision */
    public void ajoutCollisionEcouteur(Objet2DCollisionEcouteur écouteur);


    /** Retire un objet aux objet à prévenir en cas de collision */
    public void retraitCollisionEcouteur(Objet2DCollisionEcouteur écouteur);


    /** Retourne les objets avec lesquels l'objet est en collision. Null si pas de collision */
    public Iterator<IObjet2d> getCollisions();


    /** Retourne vrai si l'objet est en collision avec l'objet spécifié */
    public boolean isEnCollision(IObjet2d objet);


    /* ----------------------------
     * Position
     * ---------------------------- */
    /** Défini la position X de l'objet */
    public void setX(double x);


    /** Retourne la position X de l'objet */
    public double getX();


    /** Défini la position Y de l'objet */
    public void setY(double y);


    /** Retourne la position Y de l'objet */
    public double getY();


    /** Défini l'angle de l'objet */
    public void setAngle(double x);


    /** Retourne l'angle de l'objet */
    public double getAngle();


    /** Défini la dimension X de l'objet */
    public void setDimensionX(double x);


    /** Retourne la dimension X de l'objet */
    public double getDimensionX();


    /** Défini la dimension Y de l'objet */
    public void setDimensionY(double y);


    /** Retourne la dimension Y de l'objet */
    public double getDimensionY();


    /** Avance l'objet selon sa direction */
    public void avancer(double distance);


    /* ----------------------------
     * Image
     * ---------------------------- */
    /** Défini l'image */
    public void setImage(Image image);


    /** Retourne l'image */
    public Image getImage();


    /* ----------------------------
     * Apparence
     * ---------------------------- */
    /** Défini si l'objet peut donc entrer en collision */
    public void setSolide(boolean solide);


    /** Retourne vrai si l'objet peut entrer en collision */
    public boolean isSolide();


    /** Défini la transparence d'un objet en pourcents */
    public void setTransparence(int taux);


    /** Retourne la transparence d'un objet en pourcents */
    public int getTransparence();


    /* ----------------------------
     * Animations
     * ---------------------------- */
    /** Ajoute une animation à l'objet */
    public void ajoutAnimation(AnimationObjets2D animation);


    /** Retire une animation de l'objet */
    public void retraitAnimation(AnimationObjets2D animation);


    /** Retourne les animations de l'objet */
    public Collection<AnimationObjets2D> getAnimations();


    /* ----------------------------
     * Animations propres
     * ---------------------------- */
    /** Lit l'animation interne d'un objet entre deux clés */
    public void lire(int début,
                     int fin);


    /** Arrête la lecture de l'animation */
    public void arrêter();


    /** Positionne l'objet à une certaine clé de l'animation interne */
    public void setCléCourante(int clé);


    /** Retourne le nombre de clés de l'animation interne */
    public int getNbClés();


    /** Défini si l'animation doit être lue en boucle ou nom */
    public void setEnBoucle(boolean enBoucle);


    /** Retourne vrai si l'animation est lue en boucle */
    public boolean isEnBoucle(boolean enBoucle);


}// FIN Interface
